package com.toolbox.service.impl;

import com.toolbox.service.ToolService;
import com.toolbox.utils.DocumentConverter;
import com.toolbox.utils.CommonsImagingBackgroundChanger;
import com.toolbox.utils.IdPhotoBackgroundChanger;
import com.toolbox.utils.PPTGenerator;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

@Service
public class ToolServiceImpl implements ToolService {

    @Override
    public byte[] convertDocument(MultipartFile file, String targetFormat) throws Exception {
        // 获取源文件扩展名
        String fileName = file.getOriginalFilename();
        if (fileName == null) {
            throw new Exception("文件名不能为空");
        }
        
        // 读取文件内容
        byte[] fileBytes = file.getBytes();
        
        // 根据不同的目标格式进行转换处理
        targetFormat = targetFormat.toLowerCase();
        
        // 检查是否是PDF相关的转换
        if (targetFormat.equals("pdf")) {
            if (fileName.toLowerCase().endsWith(".docx")) {
                // DOCX转换为PDF
                return DocumentConverter.docxToPdf(fileBytes);
            } else if (fileName.toLowerCase().endsWith(".html")) {
                // HTML转换为PDF
                return DocumentConverter.htmlToPdf(fileBytes);
            } else if (fileName.toLowerCase().endsWith(".txt")) {
                // TXT转换为PDF
                return DocumentConverter.textToPdf(fileBytes);
            } else if (fileName.toLowerCase().endsWith(".doc")) {
                // 对于DOC文件，先转换为HTML再转换为PDF
                byte[] htmlBytes = DocumentConverter.docToHtml(fileBytes);
                return DocumentConverter.htmlToPdf(htmlBytes);
            } else {
                throw new Exception("不支持将" + fileName.substring(fileName.lastIndexOf('.') + 1) + "转换为PDF格式");
            }
        }
        
        // 从PDF转换到其他格式
        if (fileName.toLowerCase().endsWith(".pdf")) {
            if (targetFormat.equals("txt")) {
                // PDF转换为文本
                return DocumentConverter.pdfToText(fileBytes);
            } else if (targetFormat.equals("docx")) {
                // PDF转换为Word(DOCX)
                return DocumentConverter.pdfToDocx(fileBytes);
            } else if (targetFormat.equals("images")) {
                // PDF转换为图片集(返回ZIP文件)
                return DocumentConverter.pdfToImages(fileBytes);
            } else {
                throw new Exception("不支持将PDF转换为" + targetFormat + "格式");
            }
        }
        
        // 其他格式转换
        if (fileName.toLowerCase().endsWith(".docx") && targetFormat.equals("html")) {
            // DOCX转换为HTML
            return DocumentConverter.docxToHtml(fileBytes);
        } else if (fileName.toLowerCase().endsWith(".doc") && targetFormat.equals("html")) {
            // DOC转换为HTML
            return DocumentConverter.docToHtml(fileBytes);
        } else if (targetFormat.equals("txt")) {
            // 转换为文本
            String content = new String(fileBytes);
            if (fileName.toLowerCase().endsWith(".html")) {
                // HTML转换为文本
                return DocumentConverter.htmlToText(content).getBytes();
            } else {
                // 直接返回文件内容
                return fileBytes;
            }
        } else {
            throw new Exception("不支持的目标格式: " + targetFormat);
        }
    }

    @Override
    public byte[] changePhotoBackground(MultipartFile file, String backgroundColor) throws Exception {
        // 验证背景类型
        if (!backgroundColor.equalsIgnoreCase("red") &&
            !backgroundColor.equalsIgnoreCase("white") &&
            !backgroundColor.equalsIgnoreCase("blue")) {
            throw new Exception("不支持的背景类型: " + backgroundColor);
        }
        
        byte[] result;
        // 对于红色背景，使用基于OpenCV的深度学习实现
        if (backgroundColor.equalsIgnoreCase("red")) {
            // 使用OpenCV深度学习模型进行红底证件照处理
            result = IdPhotoBackgroundChanger.changeToRedBackground(file.getBytes(), 800, true);
            System.out.println("使用OpenCV深度学习实现成功将照片背景更换为红色");
        } else {
            // 对于其他背景颜色，继续使用原来的Apache Commons Imaging实现
            result = CommonsImagingBackgroundChanger.changePhotoBackground(file.getBytes(), backgroundColor);
            System.out.println("成功将照片背景更换为: " + backgroundColor);
        }
        
        return result;
    }

    @Override
    public String translateText(String text, String sourceLang, String targetLang) throws Exception {
        if (text == null || text.trim().isEmpty()) {
            throw new Exception("翻译文本不能为空");
        }
        
        // 简单的模拟翻译逻辑，不依赖外部库
        String translatedText = "";
        
        if (targetLang.equalsIgnoreCase("zh-CN") || targetLang.equalsIgnoreCase("zh")) {
            // 模拟翻译成中文
            translatedText = "[模拟中文翻译] " + text;
        } else if (targetLang.equalsIgnoreCase("en") || targetLang.equalsIgnoreCase("en-US")) {
            // 模拟翻译成英文
            translatedText = "[Simulated English Translation] " + text;
        } else {
            // 其他语言的模拟翻译
            translatedText = "[Simulated Translation to " + targetLang + "] " + text;
        }
        
        System.out.println("从" + sourceLang + "翻译到" + targetLang + ": " + text);
        return translatedText;
    }

    @Override
    public byte[] generatePPT(Map<String, Object> request) throws Exception {
        // 验证必要参数
        if (!request.containsKey("title")) {
            throw new Exception("PPT标题不能为空");
        }
        
        String title = (String) request.get("title");
        
        // 检查是否指定了模板类型
        if (request.containsKey("templateType")) {
            String templateType = (String) request.get("templateType");
            // 使用模板生成PPT
            return PPTGenerator.generatePPTFromTemplate(templateType, request);
        } else {
            // 创建基本的演示文稿
            List<Map<String, String>> slidesContent = new ArrayList<>();
            
            // 如果提供了内容，则添加内容幻灯片
            if (request.containsKey("slides")) {
                List<Map<String, Object>> slides = (List<Map<String, Object>>) request.get("slides");
                for (Map<String, Object> slide : slides) {
                    Map<String, String> slideContent = new HashMap<>();
                    slideContent.put("title", (String) slide.getOrDefault("title", ""));
                    slideContent.put("content", (String) slide.getOrDefault("content", ""));
                    slidesContent.add(slideContent);
                }
            }
            
            // 生成基本的演示文稿
            return PPTGenerator.generateBasicPresentation(title, slidesContent);
        }
    }
}